#ifndef __INFO_H_
#define __INFO_H_

#include <string>
#include <set>
#include <vector>
#include <sys/utsname.h>
#include <pwd.h>
#include <grp.h>
#include <utmp.h>
#include <sys/types.h>

namespace cpuinfo {
  // 获取CPU ID
  void get_id(int &a, int &b, int &c, int &d);
  // 获取CPU 厂商
  void get_company(std::string &data);
  // 获取CPU Brand
  bool get_brand(std::string &data);
  // 获取CPU Family,Model,Stepping ID
  void get_base_param(int &family, int &model, int &stepping);
  // 返回系统所有的CPU数量，包括系统中禁止用户使用的CPU个数
  long get_count();
  // 返回系统中可用的CPU个数
  long get_count_enabled();
} // end namespace cpuinfo

namespace sysinfo {
  struct sgup_info {
    gid_t gid;
    std::string name;
    std::set<std::string> users;
  };
  struct sgu_info {
    std::set<std::string> users;
    std::vector<sgup_info> groups;
  };
  struct stime {
    int64_t sec;
    int64_t usec;
  };
  struct sloginout_info {
    std::string line;
    std::string user;
    std::string host;
    stime login;
    stime logout;
    bool still; // not logout
  };
  struct spoweronoff_info {
    stime on;
    stime off;
    bool still; // not powseroff
  };

  // 系统中物理页数个数
  long pages();
  // 系统中可用的页面个数
  long pages_enabled();
  // 系统页面的大小
  long page_size();

  // 物理内存
  long long size();
  // 空闲的物理内存
  long long size_free();

  bool uname(struct utsname *buf);
  int64_t install_time();

  uid_t cur_user();
  gid_t cur_group();
  bool user(uid_t uid, struct passwd &pwd);
  bool user(const char *name, struct passwd &pwd);
  bool group(gid_t gid, sgup_info &gup);
  void groupusers(sgu_info &gui);

  void loginout_info(std::vector<sloginout_info> &info);
  void poweronoff_info(std::vector<spoweronoff_info> &info);

  std::string format_date(int64_t tm);
  std::string format_time(int64_t tm);
} // end namespace sysinfo

namespace printinfo {
  void os_info();
  void cpu_info();
  void memory_info();
  void disk_info();
  void network_info();
} // end namespace printinfo

#endif // end __INFO_H_